/**
 **************************************************************************************************************************
 * 
 **************************************************************************************************************************
 * @file RBTransformComponent.h
 **************************************************************************************************************************/
#pragma once

#ifdef  HEADER_MSG
#pragma HEADER_MSG(RBTransformComponent.h)
#endif


/**************************************************************************************************************************
 * Includes
 **************************************************************************************************************************/
#include "RBMain/RBCommon.h"
#include "RBMain/RBComponent.h"
#include "RBMain/RBHandle.h"
#include "RBMain/RBTransform.h"

/**************************************************************************************************************************
 * Forward declarations
 **************************************************************************************************************************/
RBDeclareHandle(RBTransformComponent);


/**************************************************************************************************************************
 * Classes
 **************************************************************************************************************************/
class RBTransformComponent : public RBTComponent<RBTransformComponent>
{
public:
    RB_DECLARE_COMPONENT(RBTransformComponent);

    RBTransformComponent(RBEntityHandle entityHandle = InvalidHandle);
    RBTransformComponent(const RBTransformComponent& rhs);
    RBTransformComponent& operator=(const RBTransformComponent& rhs);
    ~RBTransformComponent();

    void            AddChild  (RBTransformComponentHandle handle);

    uint32          GetChildrenCount() const;


    RBTransform&    WorldXForm()                                    { return WorldXForms[m_handle]; } ;
    RBTransform&    LocalXForm()                                    { return LocalXForms[m_handle]; } ;

    static void            Update(RBTransformComponentHandle pComponent);
    static void            UpdateEntity(RBEntityHandle handle);

private:
    void            SetParent       (RBTransformComponentHandle handle);

    RBTransformComponentHandle m_handle;
    RBTransformComponentHandle* m_children;

    static std::vector<RBTransform> WorldXForms;
    static std::vector<RBTransform> LocalXForms;
    static std::vector<RBTransformComponentHandle> Parents;

};

/**************************************************************************************************************************/
